//
// Created by Administrator on 2022/1/8.
// 使用宏实现一个printlnf函数(类比Java)
//
#include <stdio.h>
#include <stdarg.h>

/**
 *
 * @param format 类似于字符串，c语言中没有变量，所以使用char指针代替字符串
 * @param ...  va_list类型变量
 */
void Printlnf(const char *format, ...) {
    va_list args = NULL;
    va_start(args, format);
    vprintf(format, args);
    printf("\n");
    va_end(args);
}

//"Hello" "World"==="Hello World",等价
//__VA_ARGS__，也是一个宏获得动态参数
//#作用：获取传递进来的参数的实际参数名,PRINTINF(#value)--->printf(id)--->#value=id
//##作用:不传递参数时，可以出去逗号，即不用输入第二个参数
#define PRINTLNF(format, ...) printf(format"\n",##__VA_ARGS__)
#define PRINT_INF(value) PRINTLNF(#value":%d",value)
//__FILE__作用:所在文件路径
//__LINE__作用:所在行号
//__FUNCTION__:值在编译时才会有的，宏是在预编译时期就替换好了，因此在宏中直接使用这个是无效的(不可直接拼接)
#define PRINTLNCURLINE(format, ...) \
    printf("("__FILE__":%d)function:%s:"format"\n",__LINE__,__FUNCTION__ ,##__VA_ARGS__)

int main() {
    int value = 2;
    Printlnf("Hello World,%d", value);
    PRINTLNF("Hello,World,%d", value);
    PRINTLNF("Hello,World,XM");
    int x = 1;
    PRINT_INF(x);
    PRINT_INF(3 + 4);
    PRINTLNCURLINE("C is best");
    printf("456""123""123");
}
